﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpPickInterface.h"
#include "OwnerPtr.h"

#include "IObject.h"

namespace gcmp {

    /// \brief 拾取目标设置对象，用于设置拾取目标
    ///
    ///包括是否允许拾取点、线、面等设置选项
    class GCMP_PICK_INTERFACE_EXPORT IPickTarget : IObject
    {
        DEFINE_CAST_DERIVED(gcmp::IPickTarget, gcmp::IObject);
        
    public:

        /// \brief 产生默认的拾取目标设置对象，默认禁止所有目标的拾取
        /// \return 拾取目标设置对象
        static OwnerPtr<IPickTarget> Create();

        /// \brief 克隆拾取目标设置对象
        /// \return 拾取目标设置对象
        virtual OwnerPtr<IPickTarget> Clone() const = 0;

        /// \brief 复制拾取目标设置对象
        /// \param pPickTarget 源拾取目标设置对象
        /// \return void
        virtual void Assign(IPickTarget* pPickTarget) = 0;

        /// \brief 设置允许拾取所有目标
        /// \return 成功返回true，失败返回false
        virtual bool EnableAll() = 0;

        /// \brief 设置禁止拾取所有目标
        /// \return 成功返回true，失败返回false
        virtual bool DisableAll() = 0;

        /// \brief 设置允许拾取GraphicsElementShape
        /// \return 成功返回true，失败返回false
        virtual bool EnableGraphicsElementShape() = 0;

        /// \brief 设置禁止拾取GraphicsElementShape
        /// \return 成功返回true，失败返回false
        virtual bool DisableGraphicsElementShape() = 0;

        /// \brief 设置允许拾取面
        /// \return 成功返回true，失败返回false
        virtual bool EnableFace() = 0;

        /// \brief 设置禁止拾取面
        /// \return 成功返回true，失败返回false
        virtual bool DisableFace() = 0;

        /// \brief 设置允许拾取曲线
        /// \return 成功返回true，失败返回false
        virtual bool EnableCurve() = 0;

        /// \brief 设置禁止拾取曲线
        /// \return 成功返回true，失败返回false
        virtual bool DisableCurve() = 0;

        /// \brief 设置允许拾取点
        /// \return 成功返回true，失败返回false
        virtual bool EnablePoint() = 0;

        /// \brief 设置禁止拾取点
        /// \return 成功返回true，失败返回false
        virtual bool DisablePoint() = 0;

        /// \brief 设置允许拾取边
        /// \return 成功返回true，失败返回false
        virtual bool EnableEdge() = 0;

        /// \brief 设置禁止拾取边
        /// \return 成功返回true，失败返回false
        virtual bool DisableEdge() = 0;

        /// \brief 设置允许拾取文字
        /// \return 成功返回true，失败返回false
        virtual bool EnableText() = 0;

        /// \brief 设置禁止拾取文字
        /// \return 成功返回true，失败返回false
        virtual bool DisableText() = 0;

        /// \brief 设置允许拾取端点
        /// \return 成功返回true，失败返回false
        virtual bool EnableEndPoint() = 0;

        /// \brief 设置禁止拾取端点
        /// \return 成功返回true，失败返回false
        virtual bool DisableEndPoint() = 0;

        /// \brief 设置允许拾取圆心
        /// \return 成功返回true，失败返回false
        virtual bool EnableCenterPoint() = 0;

        /// \brief 设置禁止拾取圆心
        /// \return 成功返回true，失败返回false
        virtual bool DisableCenterPoint() = 0;

        /// \brief 设置允许拾取其他文档的GraphicsElementShape
        /// \return 成功返回true，失败返回false
        virtual bool EnableDocReference() = 0;

        /// \brief 设置禁止拾取其他文档的GraphicsElementShape
        /// \return 成功返回true，失败返回false
        virtual bool DisableDocReference() = 0;

        /// \brief 设置允许拾取三角面片，该开关打开时，能从pickResult中获取拾取射线与MeshBody相交的三角面片
        /// \return 成功返回true，失败返回false
        virtual bool EnableMeshTriangle() = 0;

        /// \brief 设置禁止拾取三角面片
        /// \return 成功返回true，失败返回false
        virtual bool DisableMeshTriangle() = 0;

        /// \brief 是否允许拾取GraphicsElementShape
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsGraphicsElementShapeEnabled() const = 0;

        /// \brief 是否允许拾取面
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsFaceEnabled() const = 0;

        /// \brief 是否允许拾取曲线
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsCurveEnabled() const = 0;

        /// \brief 是否允许拾取点
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsPointEnabled() const = 0;

        /// \brief 是否允许拾取边
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsEdgeEnabled() const = 0;

        /// \brief 是否允许拾取文字
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsTextEnabled() const = 0;

        /// \brief 是否允许拾取端点
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsEndPointEnabled() const = 0;

        /// \brief 是否允许拾取圆心
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsCenterPointEnabled() const = 0;

        /// \brief 是否允许拾取其他文档的GraphicsElementShape
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsDocRefEnabled() const = 0;

        /// \brief 是否允许拾取三角面片
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsMeshTriangleEnabled() const = 0;

        /// \brief 设置允许多段线分段拾取
        /// \return 成功返回true，失败返回false
        virtual bool EnableSegmentOfPolyCurve() = 0;

        /// \brief 设置禁止多段线分段拾取
        /// \return 成功返回true，失败返回false
        virtual bool DisableSegmentOfPolyCurve() = 0;

        /// \brief 是否允许多段线分段拾取
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsSegmentOfPolyCurveEnabled() const = 0;

        /// \brief 设置允许三维多段线分段拾取
        /// \return 成功返回true，失败返回false
        virtual bool EnableSegmentOfPolyCurve3d() = 0;

        /// \brief 设置禁止三维多段线分段拾取
        /// \return 成功返回true，失败返回false
        virtual bool DisableSegmentOfPolyCurve3d() = 0;

        /// \brief 是否允许三维多段线分段拾取
        /// \return 返回true表示允许，返回false表示禁止
        virtual bool IsSegmentOfPolyCurve3dEnabled() const = 0;
    };

}// namespace gcmp

